package com.iakuil.app.common.core.domain;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

/**
 * 分页查询基类
 *
 * <p>包含分页排序参数等，可以只分页不排序，反之不行。
 * <p>此乃备用方案，某些项目要求将所有参数放进JSON，项目内最好统一分页排序风格。
 * <p>e.g.
 * <pre>
 * "sort": [
 *     {
 *       "field": "updateTime",
 *       "order": "desc"
 *     },
 *     {
 *       "field": "id",
 *       "order": "asc"
 *     }
 * ]
 * <pre/>
 *
 * @author Kai
 */
@Getter
@Setter
public abstract class PageQuery extends BaseQuery {

    /**
     * 页码
     */
    @Schema(description = "当前页", example = "1")
    private Integer pageNum;

    /**
     * 每页记录数目
     */
    @Schema(description = "每页的数量", example = "10")
    private Integer pageSize;

    /**
     * 排序参数（支持多重排序）
     */
    @Schema(description = "排序参数")
    private List<Sorting> sort = new ArrayList<>();


    @Getter
    @Setter
    public static class Sorting {
        /**
         * 排序属性，比如：updateTime
         */
        @Schema(description = "属性名", example = "updateTime")
        private String field;
        /**
         * 排序方向
         */
        @Schema(description = "正序/倒序", example = "desc")
        private Direction order = Direction.ASC;

        @Override
        public String toString() {
            return field + (" " + order).toLowerCase();
        }
    }

    @Getter
    public enum Direction {
        /**
         * 正序（默认）
         */
        ASC,
        /**
         * 倒序
         */
        DESC
    }
}
